/*
 * Copyright @ 苏州瑞云信息技术有限公司 All rights reserved.
 */
package work.base.data.arr;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Spliterator;
import java.util.function.IntBinaryOperator;

/**
 * @author Sakura Shen
 * Arrays类的使用
 *
 * @date 2021/7/14
 */
public class ArrTest01 {
    public static void main(String[] args) {
        String[] aaa;
        aaa= new String[5];
        aaa[0]="AA";
        aaa[2]="CCC";
        // 数组的toString方法只会打印出数组的地址
        System.out.println(aaa.toString());
        // Arrays的toString用于打印出数组的内容
        System.out.println(Arrays.toString(aaa));

        int[] bbb = {2,3};
        int[][] arr = {{4,5,6,8},{2,3},{1,6,9}};
        System.out.println(arr.length);//输出行数
        System.out.println(arr[0].length);//输出列数
        // Arrays.deepToString()主要用于数组中还有数组的情况
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.deepToString(arr));

        int[] as ={11,22,33,55};
        // Arrays.asList返回的是Arrays内部的ArrayList类 不能用于add和remove
        // 可以通过new ArrayList进行转换 用真正的ArraysList包装一下
        List intList = Arrays.asList(as);
        intList.add(12);
        for(Object o:intList){
            System.out.println(o.toString());
        }
        String[] myArray = { "Apple", "Banana", "Orange" };
        List<String> myList = new ArrayList<String>(Arrays.asList(myArray));
        myList.add("Guava");
        for(String o:myList){
            System.out.println(o);
        }

        // Arrays提供的二分查找方法
        // 二分查找 返回数组元素的下标
        int[] num = {1,2,3,4,8,23,111,134,232,321};
        int index = Arrays.binarySearch(num,111);
        System.out.println(index);

        // 排序 数组本身的顺序会变
        int[] num1 = {12,1,43,22,6};
        Arrays.sort(num1);
        System.out.println(Arrays.toString(num1));

        // setAll方法 使用提供的生成函数来计算每个元素，设置指定数组的所有元素。
        Arrays.setAll(bbb, x->bbb[x]*2);
        System.out.println(Arrays.toString(bbb));

        // parallelPrefix() 使用提供的功能，并行地计算给定阵列的每个元素。
        int[] arr2 = new int[]{1,2,3,4,5};
        Arrays.parallelPrefix(arr2, new IntBinaryOperator() {
            @Override
            public int applyAsInt(int left, int right) {
                //left代表数组中前一个索引处的元素，计算第一个元素时，left为1
                //right代表数组中当前索引处的元素
                return left*right;
            }
        });
        // parallelPrefix 参数Lambda 表达式
        int[] arr3 =new int[]{2,3,4,5,6};
        Arrays.parallelPrefix(arr3, (x,y)->x * y);
        System.out.println(Arrays.toString(arr3));


        // Spliterator是将一个stream进行对半平分的操作类
        int[] arr4 =new int[]{1,2,3,4,5,6,7,8,9,10};
        Spliterator.OfInt sp = Arrays.spliterator(arr4);
        // 分割完后sp还剩5个元素，sp1也是5个元素
        Spliterator.OfInt sp1 = sp.trySplit();
        // 分割完后sp1为3个，sp2为2个
        Spliterator.OfInt sp2 = sp1.trySplit();
        sp.forEachRemaining((int value) -> {
            System.out.println(Thread.currentThread().getName() + "--" + value);
        });

    }

}
